/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package configuraciones;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.cip.esymons.general.bc.UsuarioWebAdapter;
import org.cip.esymons.general.be.Especialidad;
import org.cip.esymons.general.be.Nacionalidad;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.TelefonoSolicitante;
import org.cip.esymons.general.be.UsuarioWeb;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author lizardo
 */
public class UsuarioWebController {
    private PersonaNatural persona;
    private TelefonoSolicitante fono;
    private UsuarioWeb usuarioWeb;
    private Nacionalidad nacionalidad;
    
    private PersonaNaturalDelegate delegadoPersona;
    private UsuarioWebDelegate delegado;
    private TelefonoDelegate delegadoTelefono;

    private UsuarioWebAdapter usuarioAdapter;
    private List<UsuarioWebAdapter> listaUsuarioWeb;
    private List<Especialidad> listaEspecialidad;
    private List<UsuarioWeb> listaUsuario;

    private Boolean opcion;

    private Integer logueado;
    private String cuenta;
    private String nombreUsuario;
    private Long codigoPer;
    private String mensaje;
    private String claveActual;
    private String nuevaClave;
    private String confirmarClave;
    private Integer id;
    private String pregunta;
    private String respuesta;
    private String plataforma;

    /*********************** Constructor de la clase *************************/
    public UsuarioWebController() {
        inicializar();
    }

    /*************************** Sets y Gettters *****************************/
    public UsuarioWebDelegate getDelegado() {
        return delegado;
    }

    public List<Especialidad> getListaEspecialidad() {
        return listaEspecialidad;
    }
    public void setListaEspecialidad(List<Especialidad> listaEspecialidad) {
        this.listaEspecialidad = listaEspecialidad;
    }

    public Boolean getOpcion() {
        return opcion;
    }

    public void setOpcion(Boolean opcion) {
        this.opcion = opcion;
    }

    public String getCuenta() {
        limpiarDatos();
        return cuenta;
    }

    public void setCuenta(String cuenta) {
        this.cuenta = cuenta;
    }

    public String getClaveActual() {
        limpiarClaves();
        return claveActual;
    }

    public void setClaveActual(String claveActual) {
        this.claveActual = claveActual;
    }

    public String getNuevaClave() {
        return nuevaClave;
    }

    public void setNuevaClave(String nuevaClave) {
        this.nuevaClave = nuevaClave;
    }

    public String getConfirmarClave() {
        return confirmarClave;
    }

    public void setConfirmarClave(String confirmarClave) {
        this.confirmarClave = confirmarClave;
    }

    public String getPregunta() {
        return pregunta;
    }

    public void setPregunta(String pregunta) {
        this.pregunta = pregunta;
    }

    public String getRespuesta() {
        return respuesta;
    }

    public void setRespuesta(String respuesta) {
        this.respuesta = respuesta;
    }

    public UsuarioWeb getUsuarioWeb() {
        verificarSesion();
        return usuarioWeb;
    }
    public void setUsuarioWeb(UsuarioWeb usuarioWeb) {
        this.usuarioWeb = usuarioWeb;
    }

    public List<UsuarioWebAdapter> getListaUsuarioWeb() {
        listar();
        return listaUsuarioWeb;
    }
    public void setListaUsuarioWeb(List<UsuarioWebAdapter> listaUsuarioWeb) {
        this.listaUsuarioWeb = listaUsuarioWeb;
    }

    public void setDelegado(UsuarioWebDelegate delegado) {
        this.delegado = delegado;
    }

    public String getMensaje() {
        return mensaje;
    }
    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public List<UsuarioWeb> getListaUsuario() {
        return listaUsuario;
    }
    public void setListaUsuario(List<UsuarioWeb> listaUsuario) {
        this.listaUsuario = listaUsuario;
    }

    public TelefonoSolicitante getFono() {
        return fono;
    }
    public void setFono(TelefonoSolicitante fono) {
        this.fono = fono;
    }

    public PersonaNatural getPersona() {
        return persona;
    }
    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public PersonaNaturalDelegate getDelegadoPersona() {
        return delegadoPersona;
    }
    public void setDelegadoPersona(PersonaNaturalDelegate delegadoPersona) {
        this.delegadoPersona = delegadoPersona;
    }

    public Nacionalidad getNacionalidad() {
        return nacionalidad;
    }
    public void setNacionalidad(Nacionalidad nacionalidad) {
        this.nacionalidad = nacionalidad;
    }
    public UsuarioWebAdapter getUsuarioAdapter() {
        return usuarioAdapter;
    }
    public void setUsuarioAdapter(UsuarioWebAdapter usuarioAdapter) {
        this.usuarioAdapter = usuarioAdapter;
    }

    public TelefonoDelegate getDelegadoTelefono() {
        return delegadoTelefono;
    }
    public void setDelegadoTelefono(TelefonoDelegate delegadoTelefono) {
        this.delegadoTelefono = delegadoTelefono;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }
    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    public Integer getLogueado() {
        return logueado;
    }
    public void setLogueado(Integer logueado) {
        this.logueado = logueado;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Long getCodigoPer() {
        return codigoPer;
    }

    public void setCodigoPer(Long codigoPer) {
        this.codigoPer = codigoPer;
    }

    public String getPlataforma() {
        dameNombrePlataforma();
        return plataforma;
    }

    public void setPlataforma(String plataforma) {
        this.plataforma = plataforma;
    }

    

    /**************************** Metodos ************************************/
    public String inicializar() {
        persona = new PersonaNatural();
        persona.setPerSexo(true);
        persona.setSolcorreopersonal1("@hotmail.com");
        usuarioWeb = new UsuarioWeb();
        fono = new TelefonoSolicitante();
        fono.setTsoCodciudad("044");
        nacionalidad = new Nacionalidad();

        delegado = new UsuarioWebDelegate();
        delegadoPersona = new PersonaNaturalDelegate();
        delegadoTelefono = new TelefonoDelegate();

        listaUsuarioWeb = new ArrayList<UsuarioWebAdapter>();
        listaEspecialidad = new ArrayList<Especialidad>();
        //listar();
        return "";
    }

    public String limpiarDatos() {
        claveActual = "";
        pregunta = "";
        respuesta = "";
        return null;
    }

    public String guardar1() {
        try {
            delegadoPersona.registrar(persona);
            fono.setSolCodigo(persona);
            fono.setTsoEstado(true);
            persona.getTelefonoSolicitanteCollection().add(fono);
            delegadoPersona.actualizar(persona);
            usuarioWeb.setPerCodigo(persona);
            delegado.create(usuarioWeb);
            cancelar();
            mostrarMensaje("INFO: ", "Se guardo al usuario sastifactoriamente.", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede guardar al usuario.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String guardar() {
        try {
            //if (opcion) {
                persona.setPerfechaRegistro(new Date());
                nacionalidad.setNacCodigo(new Integer(1));  //peru
                persona.setNacionalidad(nacionalidad);
                persona.setPerActivo(true);
                usuarioWeb.setUweActivo(true);
                mensaje = delegado.crearUsuario(persona, fono, usuarioWeb);
                mostrarMensaje("INFO: ", mensaje, FacesMessage.SEVERITY_INFO);
                cancelar();
            //} else {
               // mensaje = delegado.modificarUsuario(persona, fono, usuarioWeb);
            //}
            
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede guardar al usuario.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String irCambiarClave() {
        return "cambiar_clave";
    }

    public String actualizaClaves() {
        try {
            if (validaClaves()) {
                System.out.println("cuenta: " + usuarioWeb.getUweCuenta());
                String clave = usuarioWeb.getUweClave();
                if (clave.compareTo(claveActual) == 0) {
                    usuarioWeb.setUweClave(nuevaClave);
                    System.out.println("XXXXXXXX " + usuarioWeb.getUweClave());
                    delegado.edit(usuarioWeb);
                    mostrarMensaje("INFO: ", "Se cambió la clave con exito", FacesMessage.SEVERITY_INFO);
                } else {
                    mostrarMensaje("FATAL: ", "La clave correspondiente a este usuario es incorrecto...", FacesMessage.SEVERITY_FATAL);
                }
            } else {
                mensaje = "Las claves no coninciden intentelo denuevo...";
                limpiarClaves();
                mostrarMensaje("WARN: ", mensaje, FacesMessage.SEVERITY_WARN);
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede actualizar el perfil del usuario.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String actualizar() {
        try {
            if (validaClaves()) {
                mensaje = delegado.modificarUsuario(persona, fono, usuarioWeb);
                mostrarMensaje("INFO: ", mensaje, FacesMessage.SEVERITY_INFO);
            } else {
                mensaje = "Las claves no coninciden intentelo denuevo...";
                limpiarClaves();
                mostrarMensaje("WARN: ", mensaje, FacesMessage.SEVERITY_WARN);
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede actualizar los datos del usuario.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public void limpiarClaves() {
        claveActual = "";
        nuevaClave = "";
        confirmarClave = "";
    }
    
    public Boolean validaClaves() {
        nuevaClave = nuevaClave.trim();
        confirmarClave = confirmarClave.trim();
        if (nuevaClave.compareTo(confirmarClave) == 0) {
            return true;
        }
        return false;
    }

    public String eliminar() {
        try {
            persona.setPerActivo(false);
            fono.setTsoEstado(false);
            usuarioWeb.setUweActivo(false);
            delegado.modificarUsuario(persona, fono, usuarioWeb);
            mostrarMensaje("INFO: ", "Usuario eliminado sastifactoriamente", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede eliminar a este usuario.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        
        return listar();
    }

    public String listar() {
        try {
            listaUsuarioWeb = delegado.listarUsuarios();
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede listar a los usuarios.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String agregar() {

        return null;
    }

    public String quitar() {

        return null;
    }

    public String buscarUsuario() {
        try {
            if (persona != null) {
                PersonaNatural per = new PersonaNatural();
                per = delegadoPersona.buscarXDNI(persona.getPerNroDNI());
                if (per != null) {
                    opcion = true;
                } else {
                    opcion = false;
                }
            } else {
                opcion = true;
            }
        } catch (Exception ex) {
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String cancelar() {
        persona = new PersonaNatural();
        fono = new TelefonoSolicitante();
        usuarioWeb = new UsuarioWeb();
        nacionalidad = new Nacionalidad();
        return null;
    }

    public String ingresarIntranet() {
        try {
            cuenta = usuarioWeb.getUweCuenta();
            String clave = usuarioWeb.getUweClave();
            usuarioWeb = delegado.logueo(cuenta,clave);
            if (usuarioWeb == null) {
                logueado = 1;
                mensaje = "Error: usuario no existe o ingreso incorrectamente la cuenta y clave, intentelo otra vez!";
                mostrarMensaje("ADVERTENCIA: ", mensaje, FacesMessage.SEVERITY_WARN);
                usuarioWeb = new UsuarioWeb();
                return "ir_a_inicio";
            } else {
                logueado = 2;
                //
                Cookie cookie = new Cookie("Usuario", usuarioWeb.getPerCodigo().getSolCodigo().toString());
                cookie.setPath("/");
                ControladorAbstracto.getResponse().addCookie(cookie);
                String uweCuenta = usuarioWeb.getUweCuenta();
                Long codPersona = usuarioWeb.getPerCodigo().getSolCodigo();
                HttpServletRequest request =  ControladorAbstracto.getRequest();
                HttpSession sesion = request.getSession();
                sesion.setAttribute("sCuenta", uweCuenta);
                sesion = null;
                sesion = request.getSession();
                sesion.setAttribute("sCodsol", codPersona);
                System.out.println("codigoZZZ: " + sesion.getAttribute("sCodsol"));
                codigoPer = codPersona;
                nombreUsuario = usuarioWeb.getPerCodigo().getNombreCompleto();
                System.out.print("Datos usuario");
                System.out.print("persona: " + usuarioWeb.getPerCodigo());
                System.out.print("usuario: " + usuarioWeb.getPerCodigo().getNombreCompleto());

                return "ir_a_portal";
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Este usuario no puede ingresar al sistema.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
            return null;
        }
    }

    public String cancelarLogeo() {
        usuarioWeb = new UsuarioWeb();
        return null;
    }

    public String reset() {
        try {
            //usuario = delegadoUsuario.find(usuario.getUweCodigo());
        } catch (Exception ex) {
            mensaje = ex.getMessage();
        }
        return null;
    }

    public String navegar_nuevo() {
        cancelar();
        return "nuevo";
    }

    public String navegar_editar() {
        try {
            persona = delegadoPersona.buscarXDNI(usuarioAdapter.getDni());
            //usuario = delegadoUsuario.find(usuarioAdapter.getCodigo());
            System.out.println("Mostrar codigo de la persona: " + persona.getSolCodigo());
            fono = delegadoTelefono.buscarXSolicitante(persona.getSolCodigo());
        } catch (Exception ex) {
            Logger.getLogger(UsuarioWebController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "editar";
    }

    public String recuperarClave() {
        try {
            id = (id != null) ? id : 0;
            usuarioWeb = delegado.recuperarClave(id);
            if (usuarioWeb != null) return "pregunta";
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se pudó mostrar la pregunta secreta.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String olvido_clave() {
        return "olvidarse";
    }

    public String registra_aqui() {
        return "registrarse";
    }

    public String mostrarClave() {
        try {
            id = (id != null) ? id : 0;
            respuesta = (respuesta != null) ? respuesta : "";
            usuarioWeb = delegado.mostrarClave(id, respuesta);
            if (usuarioWeb != null) return "respuesta";
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se pudó mostrar la pregunta secreta.", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public SelectItem[] getComboEspecilidades() {
        //este  metodo no usa converters
        try {
            //PreEventoDelegate delegadoPreevento = new PreEventoDelegate();
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            listaEspecialidad = delegado.listarEspecialidad();
            //delegadoPreevento = null;
            selects = new SelectItem[listaEspecialidad.size()];
            int cont = 0;
            for (Especialidad especialidad : listaEspecialidad) {
                SelectItem item = new SelectItem(especialidad.getEspDescripcion(), especialidad.getEspDescripcion());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen especialidades");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboUsuarioWeb() {
        try {
            UsuarioWebDelegate delegadoUsuario = new UsuarioWebDelegate();
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<UsuarioWebAdapter> listaUser = delegadoUsuario.listarUsuarios();
            delegadoUsuario = null;
            selects = new SelectItem[listaUser.size()];
            int cont = 0;
            for (UsuarioWebAdapter usuario : listaUser) {
                SelectItem item = new SelectItem(usuario.getCuenta(), usuario.getCuenta());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen usuarios");
            selects[0] = item;
            return selects;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    private void verificarSesion() {
        if (persona == null) {
            CerrarController cerrar = new CerrarController();
            cerrar.cerrandoControllers();
            cerrar = null;
        }
    }

    private void dameNombrePlataforma() {
        plataforma = Utiles.getNombrePlataforma();
    }

}
